C++ 指针 vs 数组

指针和数组是密切相关的。事实上,指针和数组在很多情况下是可以互换的。例如,一个指向数组开头的指针,可以通过使用指针的算术运算或数组索引来访问数组。请看下面的程序:

      #include <iostream>

      using namespace std;
      const int MAX = 3;

      int main ()
      {
         int  var[MAX] = {10, 100, 200};
         int  *ptr;

         // 指针中的数组地址
         ptr = var;
         for (int i = 0; i < MAX; i++)
         {
            cout << "var[" << i << "]的内存地址为 ";
            cout << ptr << endl;

            cout << "var[" << i << "] 的值为 ";
            cout << *ptr << endl;

            // 移动到下一个位置
            ptr++;
         }
         return 0;
      }

当上面的代码被编译和执行时,它会产生下列结果:

      var[0]的内存地址为 0x7fff59707adc
      var[0] 的值为 10
      var[1]的内存地址为 0x7fff59707ae0
      var[1] 的值为 100
      var[2]的内存地址为 0x7fff59707ae4
      var[2] 的值为 200

然而,指针和数组并不是完全互换的。例如,请看下面的程序:

      #include <iostream>

      using namespace std;
      const int MAX = 3;

      int main ()
      {
         int  var[MAX] = {10, 100, 200};

         for (int i = 0; i < MAX; i++)
         {
            *var = i;    // 这是正确的语法 ✅
            var++;       // 这是不正确的 ❌
         }
         return 0;
      }

把指针运算符 * 应用到 var 上是完全可以的,但修改 var 的值是非法的。这是因为 var 是一个指向数组开头的常量,不能作为左值。

由于一个数组名对应一个指针常量,只要不改变数组的值,仍然可以用指针形式的表达式。例如,下面是一个有效的语句,把 var[2] 赋值为 500:

    *(var + 2) = 500;

上面的语句是有效的,且能成功编译,因为 var 未改变。

🔚